﻿using System;
using System.Collections;
using System.Web.UI.WebControls;
using System.Collections.Generic;
using Delta_entidad.Base;
using Delta_util.Clases;
using Delta_util.Estaticos;
using Delta_webControl.DynamicData;

namespace Delta_webControl.Admin
{
    public partial class FrmCamposTabla : BaseUserControl
    {

        #region Declaracion controles web
        internal Delta_webControl.DynamicData.Delta_grid dlTipoDatos;
        internal Delta_webControl.DynamicData.Delta_grid dlColumnasTipo;
        internal Delta_webControl.DynamicData.Delta_grid dlOperaciones;

        internal Button btnImportar;
        #endregion

        #region constructor

        protected override void FrameworkInitialize()
        {
            base.FrameworkInitialize();

            
            this.dlTipoDatos = this.FindControl("dlTipoDatos") as Delta_webControl.DynamicData.Delta_grid;
            this.dlColumnasTipo = this.FindControl("dlColumnasTipo") as Delta_webControl.DynamicData.Delta_grid;
            this.dlOperaciones = this.FindControl("dlOperaciones") as Delta_webControl.DynamicData.Delta_grid;

            this.btnImportar = new Button() { ID = "btnImportar", Text = "Importar columnas tabla", OnClientClick = "pkMsgModal('Importando datos...');" }; //this.FindControl("btnImportar") as Button;
            btnImportar.Enabled = false;
            btnImportar.Click += btnImportar_Click;
            dlTipoDatos.SeleccionFila += new Delta_grid.del_Grid_SelectedIndexChanged(dlTipoDatos_SeleccionFila);
            dlColumnasTipo.Despues_Eliminar_Grid += new Delta_grid.del_Grid_Eliminar(dlTipoDatos_Despues_Eliminar_Grid);

        }

        void dlTipoDatos_Despues_Eliminar_Grid(object sender, GridViewDeleteEventArgs e, TipoBase entidadActual, TipoBase entidadPadre)
        {
            btnImportar.Enabled = entidadPadre != null && dlColumnasTipo.PermitirAgregar;
        }

        void dlTipoDatos_SeleccionFila(object sender, EventArgs e)
        {
            btnImportar.Enabled = this.dlTipoDatos.EntidadActual!= null && dlColumnasTipo.PermitirAgregar;
        }



        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                
                string tagDG = (string)Utilerias.DesEncriptar(Utilerias.ObtenerValorGET(Page, "tag"), ConfigProy.claveKey);
                Hashtable tbEstatus = Delta_grid.ObtenerEstadosGlobales(this.Page,tagDG);
                if (!Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_CAMPOS, tbEstatus))
                {
                    this.Controls.Clear();
                    this.Dispose();
                    throw new Exception("No tiene permiso para acceder a esta página");
                }


                dlTipoDatos.PermitirAgregar = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_CAMPOS_AGREGAR, tbEstatus);
                dlTipoDatos.PermitirEdicion = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_CAMPOS_EDITAR, tbEstatus);
                dlTipoDatos.PermitirEliminar = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_CAMPOS_ELIMINAR, tbEstatus);

                btnImportar.Enabled = btnImportar.Enabled && Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_COLUMNAS_IMPORTAR, tbEstatus);
                dlColumnasTipo.PermitirAgregar = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_COLUMNAS_AGREGAR, tbEstatus);
                dlColumnasTipo.PermitirEdicion = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_COLUMNAS_EDITAR, tbEstatus);
                dlColumnasTipo.PermitirEliminar = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_COLUMNAS_ELIMINAR, tbEstatus);

                dlOperaciones.PermitirAgregar = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_OPERACIONES_AGREGAR, tbEstatus);
                dlOperaciones.PermitirEdicion = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_OPERACIONES_EDITAR, tbEstatus);
                dlOperaciones.PermitirEliminar = Delta_grid.ObtenerEstatusGlobales(Enumerados.PERMISOS_GLOBALES.CONFIGURAR_OPERACIONES_ELIMINAR, tbEstatus);
                
                dlColumnasTipo.UPanel.ContentTemplateContainer.Controls.AddAt(0, btnImportar);
                dlColumnasTipo.DeltaPadre = dlTipoDatos;
                dlOperaciones.DeltaPadre = dlTipoDatos;
                int filaSel = Comun.Convertir<int>(Utilerias.ObtenerValorGET(this.Page, "cl"));
                string tabla = Utilerias.ObtenerValorGET(this.Page, "tb");
                string tp = Utilerias.ObtenerValorGET(this.Page, "tp");
                if (!string.IsNullOrWhiteSpace(tp))
                {
                    dlTipoDatos.ParametrosFiltroLista = new Dictionary<string, object>();
                    dlTipoDatos.ParametrosFiltroLista["id_tipo_gral"] = filaSel;
                    dlTipoDatos.ParametrosFiltroLista["tabla"] = tabla;
                    dlTipoDatos.ParametrosFiltroLista["tipoEntidad"] = tp;                    
                    
                }
            }
            catch (Exception ex)
            {
                Response.Write("No se logro cargar la página:" + Utilerias.getMsgError(ex));
            }
        }

        protected void btnImportar_Click(object sender, EventArgs e)
        {
            Delta_control.Control_Admin.Control_campo_tecnico ctrl = new Delta_control.Control_Admin.Control_campo_tecnico();
            Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_campo_tecnico> ctrlcampo = new Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_campo_tecnico>();
            Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_editor> ctrlEditor = new Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_editor>();
            Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_filtro_campo> ctrlFiltro = new Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_filtro_campo>();
            Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_tipo_columna> ctrlTipo = new Delta_control.Base.ControlBase<Delta_entidad.EntidadesControl.Cat_tipo_columna>();

            try
            {

                btnImportar.Enabled = false;

                Delta_entidad.EntidadesControl.Cat_tipo_gral tipo = dlTipoDatos.DatosEntidadActual<Delta_entidad.EntidadesControl.Cat_tipo_gral>();
                if (tipo != null)
                {
                    btnImportar.Enabled = dlTipoDatos.PermitirAgregar && !tipo.es_general && string.IsNullOrWhiteSpace(tipo.consulta);
                    object tipoEntidad = Comun.CrearInstancia(tipo.tipoEntidad);
                    if (tipoEntidad != null)
                    {


                        Delta_webrender.Dynamic.TablaUI tablaConfig = new Delta_webrender.Dynamic.TablaUI();
                        tablaConfig.ValidacionDibujarAtributo = (atributo, atributoEditor, atributoTipo, atributoFiltro, atributoEditorFiltro) => { return atributo != null; };
                        tablaConfig.ValidacionDibujarConfig = (atributo) => { return false; };
                        tablaConfig.tipo = tipoEntidad.GetType();
                        ctrlcampo.CrearConexion(null, true, true);
                        ctrlEditor.CrearConexion(ctrlcampo, true);
                        ctrlFiltro.CrearConexion(ctrlcampo, true);
                        ctrlTipo.CrearConexion(ctrlcampo, true);

                        foreach (Delta_entidad.EntidadesControl.Cat_campo_tecnico campo in tablaConfig.listaCamposDibujar)
                        {
                            var tipo_columna = 0;
                            var tipo_editor = 0;
                            var tipo_editorFiltro = 0;
                            Int16? id_tipo_filtro = null;

                            campo.id_tipo_gral = tipo.id_tipo_gral;
                            //Se inserta el editor del campo
                            if (campo.tipo_editor != null)
                            {
                                campo.tipo_editor.nombre = campo.nombre + "_" + tipo.tabla;
                                ctrlEditor.Insertar(campo.tipo_editor, false);
                                tipo_editor = campo.tipo_editor.id_editor;
                            }

                            //Se inserta el tipo de columna
                            if (campo.tipo != null)
                            {

                                campo.tipo.nombre_tipo = campo.nombre + "_" + tipo.tabla;
                                Type tipodato = Comun.ObtenerTipoPropiedad(tipoEntidad, campo.nombre);
                                if (tipodato.Name.ToUpper().Contains("NULLAB"))
                                    campo.tipo.tipo_codigo = tipodato.GetGenericArguments()[0].FullName;
                                else
                                    campo.tipo.tipo_codigo = tipodato.FullName;
                                campo.tipo.id_editor = tipo_editor;
                                ctrlTipo.Insertar(campo.tipo, false);
                                tipo_columna = campo.tipo.id_tipo_columna;
                            }

                            //Se inserta el tipo de editor del filtro
                            if (campo.editorFiltro != null && !string.IsNullOrWhiteSpace(campo.editorFiltro.editor))
                            {
                                campo.editorFiltro.nombre = campo.nombre + "_" + tipo.tabla;
                                ctrlEditor.Insertar(campo.editorFiltro);
                                tipo_editorFiltro = campo.editorFiltro.id_editor;
                            }

                            //Se inserta el filtro
                            if (campo.filtro != null && !string.IsNullOrWhiteSpace(campo.filtro.operacion))
                            {
                                campo.filtro.nombre = campo.nombre + "_" + tipo.tabla;
                                campo.filtro.id_editor = (Int16)tipo_editorFiltro;
                                ctrlFiltro.Insertar(campo.filtro);
                                id_tipo_filtro = campo.filtro.id_cat_filtro_campo;

                            }

                            campo.id_cat_filtro_campo = id_tipo_filtro;
                            campo.id_tipo_columna = (Int16)tipo_columna;
                            campo.es_dinamico = false;
                            campo.id_campo = -2;
                            campo.orden = 0;
                            ctrlcampo.Insertar(campo, false);
                        }
                        ctrlcampo.ConfirmarTransaccion();
                        ctrl.ImportarDatosDeTabla(tipo.id_tipo_gral);
                        dlColumnasTipo.MostrarGrid(true);
                        dlColumnasTipo.UPanel.Update();
                    }
                    else
                        throw new Exception(string.Format("El tipo de dato [{0}] no se encuentra registrado.", tipo.tipoEntidad));

                }
            }
            catch (Exception ex)
            {
                ctrlcampo.ConfirmarTransaccion(false);
                dlColumnasTipo.Error = Delta_util.Clases.Utilerias.getMsgError(ex);
                dlColumnasTipo.UPanel.Update();

            }
        }

    }
}
